package com.bn.Sample5_1;
import android.opengl.GLSurfaceView;
import android.view.MotionEvent;
import android.opengl.GLES20;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
import android.content.Context;

/**
 *
 */
class MySurfaceView extends GLSurfaceView
{
    private final float TOUCH_SCALE_FACTOR = 180.0f/320;//角度缩放比例
    private SceneRenderer mRenderer;//场景渲染器

    private float mPreviousY;//上次的触控位置Y坐标
    private float mPreviousX;//上次的触控位置X坐标

    public MySurfaceView(Context context) {
        super(context);
        this.setEGLContextClientVersion(2); //设置使用OPENGL ES2.0
        mRenderer = new SceneRenderer();	//创建场景渲染器
        setRenderer(mRenderer);				//设置渲染器
        setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY);//设置渲染模式为主动渲染
    }

    //触摸事件回调方法
    //功能：根据触控点的X、Y位移改变各个六角星绕X轴及Y轴旋转的角度
    @Override
    public boolean onTouchEvent(MotionEvent e) {
        //获取此次触控的X、Y坐标
        float y = e.getY();
        float x = e.getX();
        switch (e.getAction()) {
            //若为移动动作
            case MotionEvent.ACTION_MOVE:
                float dy = y - mPreviousY;//计算触控笔Y位移
                float dx = x - mPreviousX;//计算触控笔X位移
                //设置各个六角星绕X轴、Y轴旋转的角度
                for(SixPointedStar h:mRenderer.ha)
                {
                    h.yAngle += dx * TOUCH_SCALE_FACTOR;//设置六角星数组中的各个六角星绕y轴旋转角度
                    h.xAngle+= dy * TOUCH_SCALE_FACTOR;//设置六角星数组中的各个六角星绕x轴旋转角度
                }
        }
        mPreviousY = y;//记录触控笔位置
        mPreviousX = x;//记录触控笔位置
        return true;
    }

    //场景渲染器
    private class SceneRenderer implements GLSurfaceView.Renderer
    {
        SixPointedStar[] ha=new SixPointedStar[6];//六角星数组

        public void onDrawFrame(GL10 gl)
        {
            //清除深度缓冲与颜色缓冲
            GLES20.glClear( GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT);
            //遍历绘制六角星数组中的各个六角星
            for(SixPointedStar h:ha)
            {
                h.drawSelf();//调用方法绘制
            }
        }

        //
        public void onSurfaceChanged(GL10 gl, int width, int height) {
            //设置视窗大小及位置
            GLES20.glViewport(0, 0, width, height);
            //计算GLSurfaceView的宽高比，视口的长宽比与近平面的长宽比是相同的，这样显示在屏幕上的内容才不会变形
            float ratio= (float) width / height;
            //设置正交投影
            MatrixState.setProjectOrtho(-ratio, ratio, -1, 1, 1, 10);

            //调用此方法产生摄像机9参数位置矩阵，设置摄像机
            MatrixState.setCamera(
                    0, 0, 3f,
                    0, 0, 0f,
                    0f, 1.0f, 0.0f
            );
        }

        //创建六角星数组中的各个六角星对象，
        public void onSurfaceCreated(GL10 gl, EGLConfig config) {
            //设置屏幕背景色RGBA
            GLES20.glClearColor(0.5f,0.5f,0.5f, 1.0f);
            //创建六角星数组中的各个对象
            for(int i=0;i<ha.length;i++)
            {
                //根据右手坐标系，创建时依次为六角星指定了离观察点越来越远的Z坐标
                ha[i]=new SixPointedStar(MySurfaceView.this,0.2f,0.5f,-0.3f*i);
            }
            //打开深度检测
            GLES20.glEnable(GLES20.GL_DEPTH_TEST);
        }
    }
}
